#pragma once

#include  "iostream"
#include  "vector"
#include  "stack"
#include  "unordered_map"
#include   "queue"

using namespace std;

/*
 * 有效的算符为 '+'、'-'、'*' 和 '/' 。
每个操作数（运算对象）都可以是一个整数或者另一个表达式。
两个整数之间的除法总是 向零截断 。
表达式中不含除零运算。
输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。


示例 1：

输入：tokens = ["2","1","+","3","*"]
输出：9
解释：该算式转化为常见的中缀算术表达式为：((2 + 1) * 3) = 9
示例 2：

输入：tokens = ["4","13","5","/","+"]
输出：6
解释：该算式转化为常见的中缀算术表达式为：(4 + (13 / 5)) = 6
 *
 *
 *
 * */

//这种用一个栈求就行了 自己想多了 参考了
int evalRPN(vector<string> &tokens) {

    stack<int> st;
    for (int i = 0; i < tokens.size(); ++i) {

        if (tokens[i] == "+") {
            int n1 = st.top();
            st.pop();
            int n2 = st.top();
            st.pop();
            st.push(n2 + n1);

        } else if (tokens[i] == "-") {

            int n1 = st.top();
            st.pop();
            int n2 = st.top();
            st.pop();
            st.push(n2 - n1);

        } else if (tokens[i] == "*") {

            int n1 = st.top();
            st.pop();
            int n2 = st.top();
            st.pop();
            st.push(n2 * n1);

        } else if (tokens[i] == "/") {

            int n1 = st.top();
            st.pop();
            int n2 = st.top();
            st.pop();
            st.push(n2 / n1);

        } else {

            st.push(stoi(tokens[i]));
        }


    }


    return st.top();
}